﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;

namespace Bibilioteca.DataAccess
{
    public class MaterialesDao : DaoBase
    {
        public int paramID;
        public string codigo;
        public string titulo;
        
        public int tipoId;
        public string sinopsis;
        public int editorialId;
        public int catalogoId;

        public string autores;
        
        public MaterialesDao()
        {
            reiniciarParams();
        }

        /*
         * Establece los valores iniciales para los parametros.
         */
        private void reiniciarParams()
        {
            paramID = -1;
            codigo = "";
            titulo = "";

            tipoId = -1;
            sinopsis = "";
            editorialId = -1;
            catalogoId = -1;
            autores = "";
        }

        /*
         * Retorna un DataTable con todos los materials y todos los campos
         * asociados a ellos.
         */
        public DataTable todosLosMateriales()
        {
            string sql = "SELECT * FROM materiales";
            return EjecutarQuery(sql);
        }


        /*
		 * Dado un numero de material, lo retorna.
		 */
        public DataTable GetMaterialNumero()
        {
            string sql = "SELECT * FROM materiales where material_id = @numero";
            DataTable retorno = EjecutarQuery(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, paramID) });
            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
            return retorno;
        }


        /*
         * Busca los materials segun filtros generados.
         * Modo puede ser modoConsultaOr o modoConsultaAnd.
         * modoUpdate o modoInsert no se usan aca.
         */
        public DataTable GetMaterialFiltros(int modo)
        {
            string separador = " or "; //Consulta por defecto tipo OR.
            if (modo == 0) separador = " or ";
            else if (modo == 1) separador = " and ";

            string sql = "SELECT * FROM materiales where ";

            bool primerParam = true; //Soy el primer parametro? sino me debe anteceder un AND o un OR

            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            if (paramID != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " material_id = @material_id ";
                parametrosList.AddLast(new DbParameter("material_id", SqlDbType.Int, paramID));
            }

            if (codigo.Length > 0)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " material_codigo like '%' + @material_codigo ";
                parametrosList.AddLast(new DbParameter("material_codigo", SqlDbType.VarChar, codigo));
            }

            if (titulo.Length > 1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " material_titulo like '%' + @material_titulo ";
                parametrosList.AddLast(new DbParameter("material_titulo", SqlDbType.VarChar, titulo));
            }

            if (tipoId != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " material_tipo_id = @material_tipo_id ";
                parametrosList.AddLast(new DbParameter("material_tipo_id", SqlDbType.Int, tipoId));
            }

            if (sinopsis.Length > 1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " material_sinopsis like '%' + @material_sinopsis ";
                parametrosList.AddLast(new DbParameter("material_sinopsis", SqlDbType.VarChar, sinopsis));
            }

            if (editorialId != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " material_editorial_id = @material_editorial_id ";
                parametrosList.AddLast(new DbParameter("material_editorial_id", SqlDbType.Int, editorialId));
            }

            if (catalogoId != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " material_catalogo_id = @material_catalogo_id ";
                parametrosList.AddLast(new DbParameter("material_catalogo_id", SqlDbType.Int, catalogoId));
            }


            sql += "; ";

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            DataTable retorno = new DataTable();

            if (parametrosList.Count > 0)
                retorno = EjecutarQuery(sql, parametros1);

            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
            return retorno;
        }


        public void insertarMaterial()
        {
            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            string sql = "INSERT INTO materiales ( ";
            string sqlParametros = "";

            if (codigo.Length > 0)
            {
                sql += " material_codigo "; sqlParametros += " @material_codigo";
                parametrosList.AddLast(new DbParameter("material_codigo", SqlDbType.VarChar, codigo));
            }

            if (titulo.Length > 1)
            {
                sql += ",material_titulo "; sqlParametros += ", @material_titulo";
                parametrosList.AddLast(new DbParameter("material_titulo", SqlDbType.VarChar, titulo));
            }

            if (tipoId != -1)
            {
                sql += ", material_tipo_id "; sqlParametros += ", @material_tipo_id ";
                parametrosList.AddLast(new DbParameter("material_tipo_id", SqlDbType.Int, tipoId));
            }

            if (sinopsis.Length > 1)
            {
                sql += ", material_sinopsis "; sqlParametros += ", @material_sinopsis ";
                parametrosList.AddLast(new DbParameter("material_sinopsis", SqlDbType.VarChar, sinopsis));
            }

            if (editorialId != -1)
            {
                sql += ", material_editorial_id "; sqlParametros += ", @material_editorial_id ";
                parametrosList.AddLast(new DbParameter("material_editorial_id", SqlDbType.Int, editorialId));
            }

            if (catalogoId != -1)
            {
                sql += ", material_catalogo_id "; sqlParametros += ", @material_catalogo_id ";
                parametrosList.AddLast(new DbParameter("material_catalogo_id", SqlDbType.Int, catalogoId));
            }

            sql += ") VALUES ( " + sqlParametros + ")";

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            EjecutarUpdate(sql, parametros1);

            
            //Inserto los autores
            string [] autoresArray = autores.Split(',');
            foreach (string au in autoresArray)
            {
                string sql2 = "INSERT INTO autoresMateriales (am_autor_id ,am_material_id) "+
                    " VALUES (@autorId ,IDENT_CURRENT('materiales'));";
                EjecutarUpdate(sql2, new DbParameter[] { new DbParameter("autorId", SqlDbType.VarChar, au)});
            }

            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
        }


        public void modificarMaterial()
        {
            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            bool primerParam = true;

            string sql = "UPDATE materiales SET ";
            if (codigo.Length > 0)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "material_codigo = @material_codigo";
                parametrosList.AddLast(new DbParameter("material_codigo", SqlDbType.VarChar, codigo));
            }

            if (titulo.Length > 1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "material_titulo = @material_titulo";
                parametrosList.AddLast(new DbParameter("material_titulo", SqlDbType.VarChar, titulo));
            }

            if (tipoId != -1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += " material_tipo_id = @material_tipo_id ";
                parametrosList.AddLast(new DbParameter("material_tipo_id", SqlDbType.Int, tipoId));
            }

            if (sinopsis.Length > 1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += " material_sinopsis = @material_sinopsis ";
                parametrosList.AddLast(new DbParameter("material_sinopsis", SqlDbType.VarChar, sinopsis));
            }

            if (editorialId != -1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += " material_editorial_id = @material_editorial_id ";
                parametrosList.AddLast(new DbParameter("material_editorial_id", SqlDbType.Int, editorialId));
            }

            if (catalogoId != -1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += " material_catalogo_id = @material_catalogo_id ";
                parametrosList.AddLast(new DbParameter("material_catalogo_id", SqlDbType.Int, catalogoId));
            }


            sql += " WHERE material_id = @material_id";

            parametrosList.AddLast(new DbParameter("material_id", SqlDbType.Int, paramID));

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            EjecutarUpdate(sql, parametros1);

            //Actualizo los actores, elimino los que estaban e inserto los seleccionados, aunque no hayan cambiado
            string sql2 = "DELETE FROM autoresMateriales WHERE am_material_id=@materialId;";
            EjecutarUpdate(sql2, new DbParameter[] { new DbParameter("materialId", SqlDbType.VarChar, paramID)});

            string[] autoresArray = autores.Split(',');
            foreach (string au in autoresArray)
            {
                sql2 = "INSERT INTO autoresMateriales (am_autor_id ,am_material_id) " +
                    " VALUES (@autorId ,@materialId);";
                EjecutarUpdate(sql2, new DbParameter[] { new DbParameter("autorId", SqlDbType.VarChar, au),
                                                        new DbParameter("materialId", SqlDbType.VarChar, paramID)});
            }

            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
        }


        public void eliminarMaterial()
        {
            if (paramID != -1)
            {
                string sql = "DELETE FROM materiales where material_id = @numero";
                EjecutarUpdate(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, paramID) });

                //Elimino la entrada de autoresMateriales
                string sql2 = "DELETE FROM autoresMateriales WHERE am_material_id=@materialId;";
                EjecutarUpdate(sql2, new DbParameter[] { new DbParameter("materialId", SqlDbType.VarChar, paramID) });

                reiniciarParams();
            }

        }


    }
}